<?php
include_once BXD_INCLUDEPATH . 'lib/gettext/gettext.php';
include_once BXD_INCLUDEPATH . 'lib/gettext/streams.php';

//--> Imposto la lingua in sessione se non e' stata gia' impostata

if ($session->lang == "")
	$session->lang = BXD_DEFAULT_LANG;

$defaultDomain	= 'message';
$textDomains	= array();
$LC_CATEGORIES	= array('LC_CTYPE',
						'LC_NUMERIC',
						'LC_TIME',
						'LC_COLLATE',
						'LC_MONETARY',
						'LC_MESSAGES',
						'LC_ALL');
$EMULATEGETTEXT = 0;
$CURRENTLOCALE	= '';

//--> Class to hold a single domain included in $textDomains.
class domain
{
	var $l10n;
	var $path;
	var $codeset;
}

//--> Utility functions

/**
 * Utility function to get a StreamReader for the given text domain.
 */
function _get_reader($domain=null, $category=5, $enable_cache=true)
{
    global $textDomains, $defaultDomain, $LC_CATEGORIES;

    if (!isset($domain))
		$domain = $defaultDomain;

    if (!isset($textDomains[$domain]->l10n))
	{
		//--> get the current locale
        $locale = _setlocale(LC_MESSAGES, 0);

        $bound_path = isset($textDomains[$domain]->path) ? $textDomains[$domain]->path : './';
        $subpath	= $LC_CATEGORIES[$category] . "/" . $domain . ".mo";
		
        /* Figure out all possible locale names and start with the most
           specific ones.  I.e. for sr_CS.UTF-8@latin, look through all of
           sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr.
        */
        $locale_names = array();
        if (preg_match("/([a-z]{2,3})"            // language code
                       ."(_([A-Z]{2}))?"          // country code
                       ."(\.([-A-Za-z0-9_]))?"    // charset
                       ."(@([-A-Za-z0-9_]+))?/",  // @ modifier
                       $locale, $matches))
		{
			list(,$lang,,$country,,$charset,,$modifier) = $matches;

			if ($modifier)
			{
				$locale_names = array(	"${lang}_$country.$charset@$modifier",
										"${lang}_$country@$modifier",
										"$lang@$modifier");
			}
				array_push($locale_names, "${lang}_$country.$charset", "${lang}_$country", "$lang");
        }

        array_push($locale_names, $locale);

        $input = null;

        foreach ($locale_names as $locale)
		{
			$full_path = $bound_path . $locale . "/" . $subpath;

			if (file_exists($full_path))
			{
				$input = new FileReader($full_path);
				break;
			}
		}

        if (!array_key_exists($domain, $textDomains)) //--> Initialize an empty domain object.
          $textDomains[$domain] = new domain();

        $textDomains[$domain]->l10n = new gettext_reader($input, $enable_cache);
	}

	return $textDomains[$domain]->l10n;
}

/**
 * Returns whether we are using our emulated gettext API or PHP built-in one.
 */
function locale_emulation()
{
    global $EMULATEGETTEXT;
    return $EMULATEGETTEXT;
}

/**
 * Checks if the current locale is supported on this system.
 */
function _check_locale()
{
    global $EMULATEGETTEXT;
    return !$EMULATEGETTEXT;
}

/**
 * Get the codeset for the given domain.
 */
function _get_codeset($domain=null)
{
    global $textDomains, $defaultDomain, $LC_CATEGORIES;

	if (!isset($domain))
		$domain = $defaultDomain;
	
    return (isset($textDomains[$domain]->codeset))? $textDomains[$domain]->codeset : ini_get('mbstring.internal_encoding');
}

/**
 * Convert the given string to the encoding set by bind_textdomain_codeset.
 */
function _encode($text)
{
    $source_encoding = mb_detect_encoding($text);
    $target_encoding = _get_codeset();

    if ($source_encoding != $target_encoding)
        return mb_convert_encoding($text, $target_encoding, $source_encoding);
    else
        return $text;
}

//--> Custom implementation of the standard gettext related functions

/**
 * Sets a requested locale, if needed emulates it.
 */
function _setlocale($category, $locale)
{
    global $CURRENTLOCALE, $EMULATEGETTEXT;

    if ($locale === 0)
	{
		if ($CURRENTLOCALE != '')
			return $CURRENTLOCALE;
		else
			return _setlocale($category, $CURRENTLOCALE);
    }
	else
	{
        $ret = 0;

        if (function_exists('setlocale'))
           $ret = setlocale($category, $locale);

        if (($ret and $locale == '') or ($ret == $locale))
		{
            $EMULATEGETTEXT = 0;
            $CURRENTLOCALE = $ret;
        }
		else
		{
			if ($locale == '')
				$CURRENTLOCALE = getenv('LANG');
			else
				$CURRENTLOCALE = $locale;
			
            $EMULATEGETTEXT = 1;
        }

        global $textDomains, $defaultDomain;
        unset($textDomains[$defaultDomain]->l10n);

		return $CURRENTLOCALE;
    }
}

/**
 * Sets the path for a domain.
 */
function _bindtextdomain($domain, $path)
{
    global $textDomains;

    if (substr(php_uname(), 0, 7) == "Windows")
	{
		if ($path[strlen($path)-1] != '\\' and $path[strlen($path)-1] != '/')
			$path .= '\\';
    }
	else
	{
		if ($path[strlen($path)-1] != '/')
			$path .= '/';
    }
	
    if (!array_key_exists($domain, $textDomains))
      $textDomains[$domain] = new domain();

    $textDomains[$domain]->path = $path;
}

/**
 * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned.
 */
function _bind_textdomain_codeset($domain, $codeset)
{
	global $textDomains;
	$textDomains[$domain]->codeset = $codeset;
}

/**
 * Sets the default domain.
 */
function _textdomain($domain)
{
	global $defaultDomain;
	$defaultDomain = $domain;
}

/**
 * Lookup a message in the current domain.
 */
function _gettext($msgid)
{
	$l10n = _get_reader();
	//return $l10n->translate($msgid);
	return _encode($l10n->translate($msgid));
}

/**
 * Alias for gettext.
 */
function __($msgid)
{
	return _gettext($msgid);
}

/**
 * Plural version of gettext.
 */
function _ngettext($single, $plural, $number)
{
	$l10n = _get_reader();
	//return $l10n->ngettext($single, $plural, $number);
	return _encode($l10n->ngettext($single, $plural, $number));
}

/**
 * Override the current domain.
 */
function _dgettext($domain, $msgid)
{
	$l10n = _get_reader($domain);
	return _encode($l10n->translate($msgid));
}

/**
 * Plural version of dgettext.
 */
function _dngettext($domain, $single, $plural, $number)
{
	$l10n = _get_reader($domain);
	return _encode($l10n->ngettext($single, $plural, $number));
}

/**
 * Overrides the domain and category for a single lookup.
 */
function _dcgettext($domain, $msgid, $category)
{
	$l10n = _get_reader($domain, $category);
	return _encode($l10n->translate($msgid));
}

/**
 * Plural version of dcgettext.
 */
function _dcngettext($domain, $single, $plural, $number, $category)
{
	$l10n = _get_reader($domain, $category);
	return _encode($l10n->ngettext($single, $plural, $number));
}

// Wrappers to use if the standard gettext functions are available, but the current locale is not supported by the system.
// Use the standard impl if the current locale is supported, use the custom impl otherwise.

function T_setlocale($category, $locale)
{
	return _setlocale($category, $locale);
}

function T_bindtextdomain($domain, $path)
{
	if (_check_locale()) return bindtextdomain($domain, $path);
	else return _bindtextdomain($domain, $path);
}

function T_bind_textdomain_codeset($domain, $codeset)
{
	if (_check_locale() and function_exists('bind_textdomain_codeset')) return bind_textdomain_codeset($domain, $codeset);
	else return _bind_textdomain_codeset($domain, $codeset);
}

function T_textdomain($domain) {
	if (_check_locale()) return textdomain($domain);
	else return _textdomain($domain);
}

function T_gettext($msgid)
{
	if (_check_locale()) return gettext($msgid);
	else return _gettext($msgid);
}

function T_($msgid)
{
	if (_check_locale()) return _($msgid);
	return __($msgid);
}

function TD_($msgid, $domain='default')
{
	global $session;

	$locale = $session->lang . "_" . strtoupper($session->lang);

	T_setlocale(LC_MESSAGES, $locale);
	T_bindtextdomain($domain, "../locale");

	if (function_exists('bind_textdomain_codeset'))
	  T_bind_textdomain_codeset($domain, 'UTF-8');

	T_textdomain($domain);

	if (_check_locale()) return _($msgid);
	return __($msgid);
}

function T_ngettext($single, $plural, $number)
{
	if (_check_locale()) return ngettext($single, $plural, $number);
	else return _ngettext($single, $plural, $number);
}

function T_dgettext($domain, $msgid)
{
	if (_check_locale()) return dgettext($domain, $msgid);
	else return _dgettext($domain, $msgid);
}

function T_dngettext($domain, $single, $plural, $number)
{
	if (_check_locale()) return dngettext($domain, $single, $plural, $number);
	else return _dngettext($domain, $single, $plural, $number);
}

function T_dcgettext($domain, $msgid, $category)
{
	if (_check_locale()) return dcgettext($domain, $msgid, $category);
	else return _dcgettext($domain, $msgid, $category);
}

function T_dcngettext($domain, $single, $plural, $number, $category)
{
	if (_check_locale()) return dcngettext($domain, $single, $plural, $number, $category);
	else return _dcngettext($domain, $single, $plural, $number, $category);
}

	// Wrappers used as a drop in replacement for the standard gettext functions

if (!function_exists('gettext'))
{
	function bindtextdomain($domain, $path)
	{
		return _bindtextdomain($domain, $path);
	}

	function bind_textdomain_codeset($domain, $codeset)
	{
		return _bind_textdomain_codeset($domain, $codeset);
	}

	function textdomain($domain)
	{
		return _textdomain($domain);
	}

	function gettext($msgid)
	{
		return _gettext($msgid);
	}

	function _($msgid)
	{
		return __($msgid);
	}

	function ngettext($single, $plural, $number)
	{
		return _ngettext($single, $plural, $number);
	}

	function dgettext($domain, $msgid)
	{
		return _dgettext($domain, $msgid);
	}

	function dngettext($domain, $single, $plural, $number)
	{
		return _dngettext($domain, $single, $plural, $number);
	}

	function dcgettext($domain, $msgid, $category)
	{
		return _dcgettext($domain, $msgid, $category);
	}

	function dcngettext($domain, $single, $plural, $number, $category)
	{
		return _dcngettext($domain, $single, $plural, $number, $category);
	}
}

?>
